#include<bits/stdc++.h>
using namespace std;
const int MAXN=6e3+10;
int n,cnt,a[MAXN],f[MAXN][2],sum[MAXN],head[MAXN];
struct edge
{
	int v,next;
}e[MAXN];
void addedge(int x,int y)
{
	e[cnt]=(edge){y,head[x]};
	head[x]=cnt++;
	return;
}
void dfs(int u)
{
	f[u][0]=0;f[u][1]=a[u];
	for(int i=head[u];~i;i=e[i].next)
	{
		int v=e[i].v;
		dfs(v);
		f[u][0]+=max(f[v][0],f[v][1]);
		f[u][1]+=f[v][0];
	}
	return;
}
int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
	for(int i=1;i<n;++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		addedge(y,x);
		++sum[x];
	}
	scanf("%*d%*d");
	for(int i=1;i<=n;++i)
		if(!sum[i])
		{
			dfs(i);
			printf("%d\n",max(f[i][0],f[i][1]));
			break;
		}
	return 0;
}
